#include "mcu_adc.h"
#include "mcu.h"

void Adc_Init()
{
	ADCCON0 = 0;	 //清转换结束标志，通道0
	ADCCON1 &= 0XF0; //ADC由软件启动，ADC电路关闭
	//ADCCON2
	//AINDIDS|=(1<<OVALUE2);		// 通道OVALUE2的管脚数字输入功能关闭
	ADCCON1 |= (_ADC_CLKDIV << 4); // bit4~5: ADC 时钟分频设置 0~3，分频比例 = 2^_ADC_CLKDIV
	ADCCON2 |= (_ADC_AQT << 1);	  // bit1~3: ADC 采集时间设置 0~7，4*AQT+6个时钟周期
#if (_ADC_RATE_SLOW)
	AUXR1 |= SET_BIT4; // ADC速度慢于200K
#else
	AUXR1 &= SET_BIT4; // ADC速度快于200K
#endif
	ADCCON1 |= 0x01; // ADC电路开启
	//	EADC=1;						// 使能ADC转换结束中断
}

//开始一次转换,注意ADC中断，通道对应的管脚需高阻输入
u16 Adc_GetOnce(u8 ch)
{
	AINDIDS |= ((u8)1 << ch); //关闭对应通道的数字输入功能
	ADC_SetCh(ch);
	ADCF = 0;
	ADCS = 1; //开始转换
	while (ADCF == 0);			// 等待转换结束
	//ADCF=0;				//清除转换结束标志位
	AINDIDS = 0x00; //开启所有通道的数字输入功能
	return (((u16)ADCRH << 4) + ADCRL);
}

//获取有效的AD值（9次中值滤波）,会暂时关闭ADC中断
u16 Adc_GetValue(u8 ch)
{
	u8 bit_temp;
	u8 i;
	u16 ad[9], a;

	bit_temp = EADC;
	EADC = 0;				//失能ADC转换结束中断
	for (i = 0; i < 9; i++) //连续采集9次
	{
		ad[i] = Adc_GetOnce(ch);
	}
	a = MedianFilter16b9(ad); //中值滤波
	EADC = bit_temp;		  //还原ADC中断使能状态
	return a;
}
